#include "tools.h"
#include <stdlib.h>

// target字符串是否存是buf的子字符串,返回值是子串所在位置，len是buf的长度
// 返回-1：不存在     
// 返回0....n：字符串首字符的下标
int myStrstr(char *buf,char *target,int len,int target_len)
{
	int i,j;
	
	for(i=0; i<=len-target_len; i++)
	{
		for(j=0;j<target_len;j++)
		{
			if(*(buf+i+j)!=*(target+j))  
			{
				break; 
			}
		}
		if(j==target_len)  
		{
			return i;
		}
	}
	return -1;
}

// 表示最后一个数据存放在缓存区的哪个位置
// 返回-1：不存在  否则就是存在   
int checkStr(char *buf, char *target, int buf_len, int target_len)
{
	char temp[255] = {0};		
	// 没有出现缓存区头尾相连
	if(target_len <= buf_len)   
	{
		return myStrstr(buf, target, buf_len, target_len);
	}
	else   // 可能出现缓存区头尾相连接
	{
		memcpy(temp+target_len,buf,target_len);
		memcpy(temp,buf+buf_len-target_len,target_len);
	//	printf("===%s\n",temp);
		return myStrstr(temp,target, 255, target_len);
	}
}




// 字符穿转数字  "12"->0x12
uint8_t str2hex(char *ptr1, uint16_t *len, uint8_t *hex)  
{
	uint16_t a,b;
	uint16_t hexSize,strSize;
	strSize = strlen(ptr1);
	*len = strSize/2;   // 字节数
	for(int i=0;i<strSize;i+=2)
	{
		if(ptr1[i]<=57)   				 a = (ptr1[i]-48)*16;   // 数字
		else if(ptr1[i]<=70)       a = (ptr1[i]-55)<<4;   // 大写字母
		else if(ptr1[i]<=102)      a = (ptr1[i]-87)<<4;	// 小写字母	

		if(ptr1[i+1]<=57) 				 b = ptr1[i+1]-48; 
		else if(ptr1[i+1]<=70)     b = ptr1[i+1]-55; 
		else if(ptr1[i+1]<=102)    b = ptr1[i+1]-87; 
		hex[i/2] = a+b;
	}
	
	// 打印
//	for(int i=0;i<hexSize;i++)
//	{
//			printf("hexBuf[%d]=0x%02x ", i, hexBuf[i]);
//	}	
	return 1;
}

// 16进制转10进制  0x21->21
uint8_t hexToDec(uint8_t hex)
{
    uint8_t temp = 0;
    temp = (hex>>4 & 0x0f)*10+(hex & 0x0f);
    return temp;
}

// 字符穿转数字  "12"->0x12
uint8_t hex2str(uint16_t num, uint8_t *str, uint8_t *len)  
{
	const char tab[] = "0123456789abcdef";	// 0x0-0xf的字符查找表  ABCDEF

	str[0] = tab[(num >> 12) & 0x000f];		// 输出低4位
	str[1] = tab[(num >> 8) & 0x000f];		// 输出低4位
	str[2] = tab[(num >> 4) & 0x000f];		// 输出低4位
	str[3] = tab[num & 0x000f];	// 输出高4位
	
	// 打印
//	for(int i=0;i<hexSize;i++)
//	{
//			printf("hexBuf[%d]=0x%02x ", i, hexBuf[i]);
//	}	
	return 1;
}






/****************************
计算CRC校验
*****************************/
uint16_t CalcCRC16_MCRF4XX (uint8_t *pArray,uint16_t length) 
{
	int wCRC = 0xFFFF;
	int CRC_Count = length;
	int i;
	int num = 0;
	while (CRC_Count > 0)
	{
		CRC_Count--;
		wCRC = wCRC ^ (0xFF & pArray[num++]);
		for (i = 0; i < 8; i++)
		{
			if ((wCRC & 0x0001) == 1)
			{
				wCRC = wCRC >> 1 ^ 0x8408;   // 0x1021的2进制倒序
			}
			else
			{
				wCRC = wCRC >> 1;
			}
		}
	}
	return wCRC;
}


/*********************************************
计算异或校验，计算结果放在数据区最后一位
data:数据区首地址
len：整个数据长度（包含校验位）
**********************************************/
void CalcXOR(uint8_t *data, uint8_t len)
{
	uint8_t ck = data[2];
	for(uint8_t i=3;i<len-1;i++)
	{
		ck = ck ^ data[i];
	}
	data[len-1] = ck;
}



